#include <stdio.h>
#include <DynamicArray.h>
#include <stdbool.h>
#include <unistd.h>
#include "Scene.h"
#include "Player.h"
#include "monster.h"
#include <StdFile.h>

bool WeaponTriggerEffect(player *p)
{
    if(p->w != NULL)
    {
        if(p->w->effect == SuckBlood)
        {
            printf("因你的武器⚔ 具有吸血效果🩸,现在进行判定。。。。。。\n");
            sleep(1);
            if(GetRand(10) >= 4)
            {   
                printf("你的吸血效果🩸通过了判定!\n");
                sleep(1);
                printf("你的武器⚔ 吸取了敌人2点hp!\n");
                return true;
            }
            else
            {
                printf("你的吸血效果🩸没有通过判定!\n");
                return false;
            }
        }   
    }
    else
        return false;
}

bool DefenceTriggerEffect(player *p)
{
    if(p->d != NULL)
    {
        if(p->d->effect == Reflex)
        {
            printf("因你的防具🛡 具有反伤效果💱,现在进行判定。。。。。。\n");
            sleep(1);
            if(GetRand(10) >= 4)
            {   
                printf("你的反伤效果💱通过了判定!\n");
                sleep(1);
                printf("你的防具🛡 对敌人造成了伤害!\n");
                return true;
            }
            else
            {
                printf("你的反伤效果💱没有通过判定!\n");
                return false;
            }
        }
        else
        {
            printf("你的的防具🛡 没有反伤效果💱 ！\n");
            return false;
        }
    }
    else
        return false;
}

bool Battle(player *p, monster *m)
{
    printf("\n\n\n");
    
    printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
    printf("\n\n");
    printf("你遭遇到了|%3s|，血量🤍 :|%d|，攻击力⚔️ :|%2d|  防御力🛡️ :|%2d|\n",m->name.string,m->hp,m->attack,m->def);
    printf("\n\n");
    printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
    //让程序休眠
    sleep(2);
    while(1)
    {
        //清屏
        system("clear");
        printf("\n\n");
        printf("               这是你的战斗界面,请动用你的脑筋,使用以下操作来战胜对手吧！\n");
        printf("\n");
        printf("⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡\n");
        printf("\n\n");
        PrintPlayer(p);
        printf("敌方 %s目标信息:    名称:|%12s|  血量🤍  :|%3d|  攻击力⚔️  :|%3d|  防御力🛡️  :|%2d|\n",m->symbol.string,m->name.string,m->hp,m->attack,m->def);
        printf("\n\n");
        printf("⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡 ⚔ 🛡 ⚒ ⛏ 🛠 ⚙ 🛡\n");
        printf("\n");
        printf("请做出你的选择：\n");
        printf("1、进攻🗡\n");
        printf("2、暴击⚔\n");
        printf("3、逃跑🏃\n");
        printf("4、使用道具💊\n");
        printf("5、光荣🎈\n");
        printf("\n\n");
        int choice = 0;
        //清除缓冲区的换行符
        scanf("%d",&choice);
        while(getchar() != '\n');
        switch(choice)
        {
            case 1:
                if(p->sp < 3)
                {
                    printf("你的普通攻击为你积攒了1点怒气💢!\n");
                    p->sp++;                   
                }
                else
                {
                    printf("你的怒气值已满!快使用你的怒气值来提高你的暴击伤害吧!\n");
                    p->sp = 3;
                }
                printf("\n");
                sleep(1);
                if(p->attack <= m->def)
                    printf("因你的攻击力太低，未能击破|%s|的防御, 你没有对|%s|造成伤害!\n",m->name.string,m->name.string);
                else
                {

                    printf("你对|%s|发起了进攻🗡 ,造成了%d点伤害🩸\n",m->name.string,p->attack - m->def);
                    m->hp -= (p->attack-m->def);
                    if(WeaponTriggerEffect(p) == true)
                        p->hp += 2; 
                    if(p->hp >= 60)
                        p->hp = 60;
                    if(m->hp <= 0)
                    {   
                        m->hp = 0;
                        break;
                    }
                }
                sleep(1);
                printf("|%s|对你发起了反击🗡 \n",m->name.string);
                if(p->def >= m->attack)
                    printf("因|%s|的攻击力太低, 未能击破你的防御, |%s|没有对你造成伤害!\n",m->name.string,m->name.string);
                else
                {
                    printf("格挡率💥判定中。。。。。。\n");
                    sleep(1);
                    if(GetRand(200-p->parry) <  p->parry)
                        printf("你的格挡率💥通过了判定!你豁免了本次伤害\n");
                    else
                    {
                        printf("你的格挡率💥未通过判定!\n");
                        sleep(1);
                        printf("|%s|对你造成了%d点伤害🩸\n",m->name.string,m->attack-p->def);
                        p->hp -= (m->attack-p->def);
                        if(DefenceTriggerEffect(p) == true)                       
                            m->hp -= m->attack/2;                                     
                    } 
                }   
                sleep(1);
                break;
            case 2:
                if(p->sp == 0)
                    printf("抱歉,你的怒气值💢不够,无法使用暴击✨!\n");
                else
                {
                    
                    printf("你的暴击伤害获得了基于你怒气值的提升!\n");
                    p->sp = 0;
                    printf("\n");
                    sleep(1);
                    printf("暴击率✨判定中。。。。。。\n");
                    printf("\n");
                    sleep(1);
                    if(GetRand(200 - p->crit) <= p->crit)
                    {
                        printf("你的暴击率✨通过了判定!\n");
                        if(p->attack * (p->sp + 1) <= m->def)
                        {
                            printf("因你的攻击力太低, 未能击破|%s|的防御, 你没有对|%s|造成伤害!\n",m->name.string,m->name.string); 
                        }
                        else
                        {
                            printf("你对|%s|发起了暴击⚔ ! 对|%s|造成了%d点伤害🩸\n",m->name.string,m->name.string,p->attack * (1+p->sp)-m->def);
                            m->hp -= (2 * p->attack-m->def);
                            if(WeaponTriggerEffect(p) == true)
                                p->hp += 2; 
                            if(p->hp >= 60)
                                p->hp = 60;
                            if(m->hp <= 0)
                                break;                        
                        }
                        printf("\n");
                        printf("|%s|对你发起了反击🗡 \n",m->name.string);
                        sleep(1);
                        if(p->def >= m->attack)
                            printf("因|%s|的攻击力太低, 未能击破你的防御, |%s|没有对你造成伤害!\n",m->name.string,m->name.string);
                        else
                        {
                            sleep(1);
                            printf("格挡率💥判定中。。。。。。\n");
                            printf("\n");
                            sleep(1);
                            if(GetRand(200-p->parry) <= p->parry)
                                printf("你的格挡率💥通过了判定!你豁免了本次伤害\n");
                            else
                            {
                                printf("你的格挡率💥未通过判定!\n");
                                sleep(1);
                    
                                printf("|%s|对你造成了%d点伤害🩸\n",m->name.string,m->attack-p->def);
                                p->hp -= (m->attack-p->def);
                                if(DefenceTriggerEffect(p) == true)                       
                                    m->hp -= m->attack/2;     
                            }
                        }  
                    }
                    else
                    {
                        printf("你的暴击率✨未通过判定!\n");
                        printf("暴击⚔ 失败！未能对|%s|造成伤害！\n",m->name.string);
                        printf("\n");
                        sleep(1);
                        printf("|%s|对你发起了反击🗡 \n",m->name.string);
                        sleep(1);
                        if(p->def >= m->attack)
                            printf("因|%s|的攻击力太低, 未能击破你的防御, |%s|没有对你造成伤害!\n",m->name.string,m->name.string);
                        else
                        {
                            printf("格挡率💥判定中。。。。。。\n");
                            printf("\n");
                            sleep(1);
                            if(GetRand(200-p->parry) <= p->parry)
                                printf("你的格挡率💥通过了判定!你豁免了本次伤害\n");
                            else
                            {
                                printf("你的格挡率💥未通过判定!\n");
                                sleep(1);
                                printf("|%s|对你造成了%d点伤害🩸\n",m->name.string,m->attack-p->def);
                                p->hp -= (m->attack-p->def);
                                if(DefenceTriggerEffect(p) == true)                       
                                    m->hp -= m->attack/2;     
                            }
                        }
                    }

                }
                sleep(2);
                break;
            case 3: 
                if(IsEqual(&m->name,"大黑龙") == true)
                {
                    printf("你面对的是本游戏boss ,禁止逃跑❗\n");
                    sleep(1);
                    if(p->def >= m->attack)
                        printf("因|%s|的攻击力太低, 未能击破你的防御, |%s|没有对你造成伤害!\n",m->name.string,m->name.string);
                    else
                    {
                        printf("|%s|对你发起了攻击🗡 ",m->name.string);
                        printf("格挡率💥判定中。。。。。。\n");
                        printf("\n");
                        sleep(1);
                        
                        if(GetRand(200-p->parry) == 0)
                            printf("你的格挡率💥通过了判定!你豁免了本次伤害\n");
                        else
                            {
                                printf("你的格挡率💥未通过判定!\n");
                                sleep(1);
                                printf("|%s|对你造成了%d点伤害🩸\n",m->name.string,m->attack-p->def);
                                p->hp -= (m->attack - p->def);   
                                if(DefenceTriggerEffect(p) == true)                       
                                    m->hp -= m->attack/2;         
                            }
                    }
                    sleep(1);
                    break;
                }
                if(GetRand(2) == 0)
                {
                    printf("你逃跑成功🚩！\n");
                    sleep(1);
                    system("clear");
                    return true;//战斗结束，玩家存活
                }
                else
                {
                    printf("你逃跑失败了🏴！\n");
                    printf("\n");
                    sleep(1);
                    if(p->def >= m->attack)
                        printf("因|%s|的攻击力太低, 未能击破你的防御, |%s|没有对你造成伤害!\n",m->name.string,m->name.string);
                    else
                    {
                    printf("|%s|对你发起了攻击🗡 ，造成了%d点伤害🩸\n",m->name.string,m->attack-p->def);
                    p->hp -= (m->attack-p->def);
                    sleep(1);
                    }
                }
                sleep(1);
                break;
            case 4:
                sleep(1);
                ShowBag(p);
                if(p->def >= m->attack)
                    printf("因|%s|的攻击力太低, 未能击破你的防御, |%s|没有对你造成伤害!\n",m->name.string,m->name.string);
                else
                {
                    printf("|%s|对你发起了攻击🗡 ，造成了%d点伤害🩸\n",m->name.string,m->attack-p->def);
                    p->hp -= (m->attack - p->def);
                }
                sleep(1);
                break;
            
            case 5:
                sleep(1);
                printf("面对强大的敌人，你深知自己无法战胜对方，所以你选择体面的死去🎌 \n");
                p->hp = 0;
                sleep(1);
                exit(0);
            default:
                break;
        }

        sleep(1);
        if(p->hp <= 0)
        {
            p->hp = 0;
            printf("战斗失败！\n");
            sleep(1);
            return false;
        }

        if(m->hp <= 0)
        {
            m->hp = 0;
            printf("战斗胜利🚩！\n");
            printf("怪物|%s|掉落%d点经验🥇, %d枚金币💰\n",m->name.string,m->exp,m->golden);
            sleep(1);
            p->exp += m->exp; 
            p->golden += m->golden;
            return true;
        }
    }
}

bool UserLogin(player *p)
{
    printf("\n\n\n");
    printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
    printf("\n\n");
    printf("在进入游戏前需要确认一下你的身份:1、登陆 2、注册 3、退出\n");
    int choice = GetInput();
    if(choice == 1)
    {
        if(IsFileExist("UserAccount.txt") == false)
        {
            User temp;
            printf("抱歉，你还没有自己的账户，请注册！\n");
            sleep(1);
            printf("请输入你想创建的账号与密码!\n");
            printf("账号: ");
            scanf(" %s",temp.name);
            while(getchar() != '\n');
            strcat(temp.name," ");
            AppendToFIle("UserAccount.txt",temp.name,strlen(temp.name));
            printf("密码: ");
            scanf("%s",temp.passwd);
            while(getchar() != '\n');
            strcat(temp.passwd,"\n");
            AppendToFIle("UserAccount.txt",temp.passwd,strlen(temp.passwd));  
            sleep(1);
            printf("创建用户成功！\n");
            printf("请返回界面重新登陆！\n");
            return false;  
        }
        else
        {
            if(GetFileSize == 0)
            {
                printf("还没有任何用户账号！\n");
                return false;
            }
  
            User user;
            printf("请以标准格式输入你的账号、密码！\n");
            printf("请输入你的账号:");
            scanf("%s",user.name);
            printf("请输入你的密码:");
            scanf("%s",user.passwd);
            MyStrList content = GetLineFromFile("UserAccount.txt");
            for(int i = 0; i < content.len; i++)
            {
                User temp;
                //将字符串格式化处理到结构体对象中
                sscanf(content.stringList[i].string,"%s %s",temp.name,temp.passwd);
                if(strcmp(temp.name,user.name) == 0 && strcmp(temp.passwd,user.passwd) == 0)
                {
                    sleep(1);
                    printf("登陆成功!\n");
                    WriteToFIle("/home/lvguanzhong/1class/MyMagicTower/UserAccount/CurrentUser.txt",user.name,strlen(user.name));
                    return true;
                }
            }
            sleep(1);
            printf("账号密码错误!请返回界面重新登陆！\n");
            return false;
        }
    }
    //注册
    else if(choice == 2)
    {
        User temp;
        User user;
        printf("请输入你想创建的账号与密码：(例: 账号:zhangsan 密码:123)\n");
        printf("账号: ");
        scanf(" %s",user.name);
        while(getchar() != '\n');
        MyStrList content = GetLineFromFile("UserAccount.txt");
        for(int i = 0; i < content.len; i++)
        {
            sscanf(content.stringList[i].string,"%s %s",temp.name,temp.passwd);
            if(strcmp(temp.name,user.name) == 0 )
            {
                sleep(1);
                printf("账户已存在, 请返回界面登陆或新建一个账号!\n");
                return false;
            }
        }
        strcat(user.name," ");
        AppendToFIle("UserAccount.txt",user.name,strlen(user.name));
        printf("密码: ");
        scanf("%s",user.passwd);
        while(getchar() != '\n');
        strcat(user.passwd,"\n");
        AppendToFIle("UserAccount.txt",user.passwd,strlen(user.passwd));  
        sleep(1);
        printf("创建用户成功！\n");
        printf("请返回界面重新登陆！\n");
        return false;  
    }
    else if(choice == 3)
    {
        printf("你已选择退出游戏，请稍候。。。。。。\n");
        sleep(1);
        exit(0);
    }
        
}

void GameLaunchInterface(player *p,DArray *ms,char* (*map)[MAPSIZE])
{
    while(1)
    {
        system("clear");
        printf("\n\n\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳         1、 开始游戏               🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳         2、 加载存档                🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳         3、 退出游戏                🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
         printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("\n\n请做出你的选择:\n");
        int choice = 0;
        scanf("%d",&choice);
        while(getchar() != '\n');
        switch(choice)
        {
            case 1:
                    printf("正在为你打开游戏，请稍候。。。。。。\n");
                    sleep(1);
                    return;
            case 2:
                    printf("正在为你打开存档界面🔆，请稍候。。。。。。\n");
                    LoadFileInterFace(p,ms,map);
                    sleep(1);
                    printf("\n存档加载成功!\n");
                    break;
            case 3:
                    printf("正在为你退出游戏，请稍侯。。。。。。\n");
                    sleep(1);
                    exit(0);     
            default:
                    break;         
        }
    }
    
} 


int main(int argc, char *argv[])
{
    system("clear");
    printf("\n\n\n");
    printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
    printf("\n\n");
    printf("欢迎来到魔塔游戏！！！\n");
    printf("\n\n");
    printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
    sleep(1);
    system("clear");

    //初始化场景
    char* Map[MAPSIZE][MAPSIZE] = {0};
    InitMap(Map);

    //初始化玩家
    player p;
    InitPlayer(&p);
    Map[p.x][p.y] = p.symbol;


    //初始化怪兽
    INITDARRY(monsters);
    SetMonsters(&monsters);
    SetMonsterPosition(&monsters,Map); 

    while(UserLogin(&p) == false)
    {
        sleep(1);
        UserLogin(&p);
    }
    
    InitString(&p.name);
    MyStrList content = GetLineFromFile("/home/lvguanzhong/1class/MyMagicTower/UserAccount/CurrentUser.txt");
    p.name.string = content.stringList[0].string;

    //游戏启动界面
    sleep(1);
    GameLaunchInterface(&p,&monsters,Map);
    sleep(1);
    int seconds = 3;
    while(seconds >= 0)
    {
        system("clear");
        printf("\n\n\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        printf("\n\n");
        printf("正在为你生成游戏地图，请耐心等待|%d|秒!\n",seconds);
        printf("\n\n");
        printf("🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳✨✨🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳🏳\n");
        sleep(1);
        seconds--;
    }
    sleep(1);
    printf("\n\n\n");
    printf("生成游戏地图成功,请开始你惊心动魄的大冒险吧!\n");
    sleep(2);


    system("clear");  
    PrintMap(Map);
    monster *posM = NULL;
    while(1)
    {
        PrintPlayer(&p);
        PlayerMove(&p,&monsters,Map);
        system("clear");
        if(posM != NULL)
        {
            Map[posM->x][posM->y] = posM->symbol.string;
            posM == NULL;
        }
        monster *m = GetMonsterByPosition(&monsters,p.x,p.y);
        if(m != NULL)
        {
            if(Battle(&p,m) == false)
            {
                printf("你阵亡了👻！游戏结束！\n");
                sleep(1);
                return -1;
            }

            if(m->hp == 0)
            {
                if(IsContains(&m->name,"黑龙") == true)
                {
                    printf("你击败了boss黑龙🐲,游戏结束!\n");
                    return 0;
                }
                printf("|%s|已被你击败！\n",m->name.string);
                LevelUp(&p);
                Map[m->x][m->y] = p.symbol;
                sleep(2);
            }
            else
            {
                posM = m;
            }
        }
        PrintMap(Map);
        char file[255] = {0};
        sprintf(file,"/home/lvguanzhong/1class/MyMagicTower/UserAccount/%s-AutoSaveFile.txt",p.name.string);
        MyStr str = PlayerToString(&p);
        WriteToFIle(file,str.string,str.len);
        MyStr mstr = MonstersToString(&monsters);
        AppendToFIle(file,mstr.string,mstr.len);
        printf("                                                                                                  自动存档成功！\n\n");
        //printf("保存玩家状态：%s\n",PlayerToString(&p).string);
    }
    return 0;
}